﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace Korhaz
{
    public abstract class DAL
    {
        protected static bool kapcsolodva;
        protected static bool ConnectionCreated;

        //ebben a projektben egy SQL szerveren futo adatbazishoz akarunk csatlakozni
        //SQL adatbazishoz SqlConnection objektumokkal kapcsolodhatunk
        protected static SqlConnection mySqlConn;

        //kapcsolati karakterlanc: szerver neve, adatbazis neve(az 5-6.laborfeladathoz tartozo adatbazis) , kapcsolodas modja

        protected string strSqlConn = "Data Source=TIMI-PC\\SQLEXPRESS;Initial Catalog=Korhaz2;Integrated Security=SSPI";

        //parancsobjektum-ezek segitsegevel tudunk SQL utasitasokat vegrehajtani
        //parancsobjektumok a kapcsolati objektumok segitsegevel tartanak kapcsolatot 
        //az adatbazissal
        protected System.Data.SqlClient.SqlCommand myComm;
        //a kovetkezo ket objektum segitsegevel az adatbazisbol adatOKat olvashatunk be
        //illetve tarolhatjuk ezeket
        protected System.Data.SqlClient.SqlDataReader myDataReader;
        protected System.Data.DataSet myDataSet;

        //igaz, ha a kapcsolat letrejott-a szarmaztatott osztaly konstruktoraba kell
        protected bool IsConnectCreated()
        {
            return ConnectionCreated;
        }

        protected bool IsConnected()
        {
            return kapcsolodva;
        }

        protected System.Data.SqlClient.SqlConnection theConnection()
        { return mySqlConn; }

        //kapcsolatot teremt az adatbazissal, ha ez meg nem tortent meg eddig 
        protected bool MakeConnection()
        {
            // Create the Connection if is was not already created.
            if (ConnectionCreated != true)
            {
                try
                {
                    //uj OleDbConnection objektum letrehozasa
                    //ezzel a konstruktorral letrehoztuk a kapcsolati objektumot es beallitottuk a ConnectionString
                    //tulajdonsagat is
                    //ez csak akkor allithato be, ha a kapcsolati objektum zarva van
                    mySqlConn = new SqlConnection(strSqlConn);
                    //kapcsolodunk az adatbazishoz
                    mySqlConn.Open();
                    ConnectionCreated = true; //logikai valtozo-igaz, ha a kapcsolat letrejott
                    //be is zarjuk a kapcsolatot-igyekeznunk kell minel kevesebb ideig nyitva hagyni a kapcsolatot,
                    //mert igy sporolunk az adatbazis eroforrasaival
                    mySqlConn.Close();
                    kapcsolodva = false;
                    //igazat terithetunk vissza, hisz a kapcsolat gond nelkul letrejott
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            else { return true; }
        }

        /// <summary>
        /// Open the Connection when the state is not already open.
        /// </summary>
        protected bool OpenConnection()
        {
            // Open the Connection when the state is not already open.
            if (kapcsolodva != true)
            {
                try
                {
                    mySqlConn.Open();
                    kapcsolodva = true;
                    return true;
                }
                catch
                {
                    return false;
                }

            }
            else { return true; }
        }

        //bezarjuk a kapcsolatot, ha meg nyitva van
        internal void CloseConnection()
        {
            // Close the Connection when the connection is opened.
            if (kapcsolodva == true)
            {
                mySqlConn.Close();
                kapcsolodva = false;
            }
        }

        //vegrehajtja az elso parameterben megadott stringben levo select utasitast
        //egy eredmenyhalmaz jon letre ezaltal, melyet egy DataReader objektumban tarolunk el
        //es teritunk vissza
        protected SqlDataReader myExecuteReader(string sQuery, ref string ErrMess)
        {
            try
            {
                this.OpenConnection();//megnyitja az adatbazis-kapcsolatot, ha meg nincs megnyitva) 

                //uj sqlcommand objektumot igy is letrehozhatunk:
                //sQuery-tartalmazza az SQL utasitast, melybol adatot kerunk le
                //mySqlConn-SqlConnection objektum 
                myComm = new SqlCommand(sQuery, mySqlConn);
                //myComm OleDbCommand CommandText tulajdonsagat atkuldi a myAccesConn
                //connectionnek es letrehoz egy DataReadert

                //ExectuerReader tagfgv-olyan select utasitasok vegrehajtasara szolgal, melyek
                //eredmenyhalmazt adnak vissza-az eredmenyhalmaz egy DataReader objektumban ter vissza
                myDataReader = myComm.ExecuteReader();
                ErrMess = "OK";

                return myDataReader;

            }
            catch (SqlException e)
            {
                ErrMess = e.Message;
                this.CloseConnection();
                return null;
            }
        }

        protected string myExecuteInsert(string sInsert)
        {
            SqlDataAdapter da = new SqlDataAdapter();
            try
            {
                OpenConnection();
                da.InsertCommand = new SqlCommand(sInsert, mySqlConn);
                da.InsertCommand.ExecuteNonQuery();
                CloseConnection();
                return "OK";
            }
            catch (Exception ex)
            {
                CloseConnection();
                return ex.ToString();
            }
        }

        protected void MyDeleteComm(string sDelete, SqlDataAdapter da, ref string Err)
        {
            try
            {
                OpenConnection();
                da.DeleteCommand = new SqlCommand(sDelete, mySqlConn);
                da.DeleteCommand.ExecuteNonQuery();
                Err = "OK";
            }
            catch (Exception ex)
            {
                Err = ex.ToString();
            }
            CloseConnection();
        }


        protected string myExecuteDelete(string sDelete)
        {
            SqlDataAdapter da = new SqlDataAdapter();
            try
            {
                OpenConnection();
                da.DeleteCommand = new SqlCommand(sDelete, mySqlConn);
                da.DeleteCommand.ExecuteNonQuery();
                CloseConnection();
                return "OK";
            }
            catch (Exception ex)
            {
                CloseConnection();
                return ex.ToString();
            }
        }

        protected string myInsertCommand(string sInsert)
        {
            SqlDataAdapter da = new SqlDataAdapter();
            try
            {
                OpenConnection();
                da.InsertCommand = new SqlCommand(sInsert, mySqlConn);
                da.InsertCommand.ExecuteNonQuery();
                CloseConnection();
                return "OK";
            }
            catch (Exception ex)
            {
                CloseConnection();
                return ex.ToString();
            }
        }

        protected string myExecuteUpdate(string sUpdate)
        {
            try
            {
                SqlDataAdapter da = new SqlDataAdapter();
                OpenConnection();
                da.UpdateCommand = new SqlCommand(sUpdate, mySqlConn);
                da.UpdateCommand.ExecuteNonQuery();
                CloseConnection();
                return "OK";
            }
            catch (Exception ex)
            {
                CloseConnection();
                return ex.ToString();
            }
        }

        protected string myUpdateCommand(string sUpdate)
        {
            try
            {
                SqlDataAdapter da = new SqlDataAdapter();
                OpenConnection();
                da.UpdateCommand = new SqlCommand(sUpdate, mySqlConn);
                da.UpdateCommand.ExecuteNonQuery();
                CloseConnection();
                return "OK";
            }
            catch (Exception ex)
            {
                CloseConnection();
                return ex.ToString();
            }
        }

        protected int myExecuteScalar(string myQuery, ref string ErrMsg)
        {
            int iScalar = 0;
            this.OpenConnection();
            myComm = new SqlCommand(myQuery, mySqlConn);
            try
            {
                iScalar = Convert.ToInt32(myComm.ExecuteScalar());
            }
            catch (Exception e)
            {
                ErrMsg = e.Message;
            }
            this.CloseConnection();
            return iScalar;
        }

        //protected DataSet myFillDataSetFromString(String sSQL, String sTableName, ref SqlDataAdapter da, ref string Errm)
        //{
        //    //da = new SqlDataAdapter();
        //    try
        //    {
        //        //		da.TableMappings.Add("Table", sTableName);
        //        OpenConnection();
        //        myComm = new SqlCommand(sSQL, mySqlConn);
        //        myComm.CommandType = CommandType.Text;
        //        da.SelectCommand = myComm;
        //        DataSet ds = new DataSet(sTableName);
        //        da.Fill(ds);
        //        CloseConnection();
        //        Errm = "OK";
        //        return ds;
        //    }
        //    catch (Exception ex)
        //    {
        //        Errm = ex.Message;
        //        return null;
        //    }
        //}
    }
}
